// 实体类
import request from '../request'
import { REQUEST_URL } from '@/config/EnvProperties'

export default class DBAccess {
  public static GenerGUID() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      const r = (Math.random() * 16) | 0,
        v = c == 'x' ? r : (r & 0x3) | 0x8
      return v.toString(16)
    })

    //  const dt= new  Date();
    //  return Math.random().toString(); // dt.toString();
    // return Math.random().toString(2); // dt.toString();
  }
  public static GenerOID(type?: string) {
    return 100
  }

  public static data: Array<any> = []

  public static async RunDBSrc(dbSrc: string, dbType: number, dbSource = '') {
    if (dbSrc == null || dbSrc === '') {
      throw new Error('执行的数据语句不能为空')
    }
    if (dbType == 0) return await this.RunSQLReturnTable(dbSrc, dbSource)
    if (dbType == 1) return this.RunUrlReturnJSON(dbSrc)
    if (dbType == 2) {
      const str = this.RunFunctionReturnStr(dbSrc)
      if (str == null || str == '') {
        return []
      }
      return JSON.parse(str)
    }
    return []
  }

  /**
   * 执行SQL语句
   * @param sql 执行的语句
   * @param dbSource 数据源类型 本地和外部数据源
   * @constructor
   */
  public static async RunSQLReturnTable(sql: string, dbSource = 'local') {
    if (sql == null || typeof sql === 'undefined' || sql == '') {
      throw new Error('数据查询为空，请求无效')
    }
    // if (sql.includes('@')==true)
    const formData = new FormData()
    formData.append('SQL', encodeURIComponent(sql))
    formData.append('DBSrc', dbSource)
    return await request.post<any, any>(REQUEST_URL, formData, {
      params: {
        DoType: 'DBAccess_RunSQLReturnTable',
        t: Date.now()
      }
    })
  }

  /**
   * 根据URl请求返回字符串数据
   * @param url
   * @constructor
   */
  public static async RunUrlReturnString(url: string) {
    if (url == null || typeof url === 'undefined') {
      throw new Error('url为空，请求无效')
    }

    if (url.match(/^http:\/\//) == null) {
      const { VITE_GLOB_API_URL } = import.meta.env

      url = VITE_GLOB_API_URL + '/' + url
    }
    const formData = new FormData()
    formData.append('urlExt', url)
    return await request.post<any, any>(REQUEST_URL, formData, {
      params: {
        DoType: 'RunUrlCrossReturnString',
        t: Date.now()
      }
    })
  }

  /**
   * 根据URl请求返回JSON格式数据
   * @param url
   * @constructor
   */
  public static async RunUrlReturnJSON(url: string) {
    const str = await this.RunUrlReturnString(url)
    if (typeof str == 'string') {
      if (str.includes('url为空') == true) {
        this.data = []
        return
      }
      if (str.includes('err@') == true) {
        this.data = []
        throw new Error(str.replace('err@', ''))
      }
      try {
        this.data = JSON.parse(str)
      } catch (e: any) {
        this.data = []
        console.log('RunUrlReturnJSON数据解析失败:' + str)
        throw new Error('值获取失败')
      }
    }
  }
  /**
   * 执行方法
   * @param funcName 方法名称
   * @constructor
   */
  public static RunFunctionReturnStr(funcName: string) {
    //可能需要动态引入js/ts文件
    try {
      funcName = funcName.replace(/~/g, "'")
      if (funcName.indexOf('(') == -1) return eval(funcName + '()')
      else return eval(funcName)
    } catch (e: any) {
      if (e.message) throw new Error('执行方法[' + funcName + ']错误:' + e.message)
    }
  }
}
